import java.io.File;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Iterator;
/**
*
* Classe de um cliente
*/
public class Cliente {
    
    private HashMap<String,ArquivoLocal> listaArquivosLocal;
    private Service servidor;
    
    public static void main(String[] args) throws UnknownHostException, RemoteException {
        // define a pasta de compartilhamento para "/tmp/t_sd/"
        // Contrutor de cliente realiza várias funções
        Cliente cliente = new Cliente("/tmp/cliente/");
        // Iterator para imprimir a lista na tela (exemplo)
        for (Iterator<ArquivoLocal> it = cliente.listaArquivosLocal.values().iterator(); it.hasNext();) {
            ArquivoLocal arquivo = it.next();
            System.out.println(arquivo.getNome());
            System.out.println(arquivo.getCliente_owner_ip());
            cliente.servidor.compartilharArquivo(arquivo);
        }
        System.out.println("Versao do file.txt: "+cliente.servidor.verificarVersaoArquivo("file.txt"));
    }
    
    public Cliente(String caminho) throws UnknownHostException {
        // Verificar o retorno do IP para cada cliente
        java.net.InetAddress i = java.net.InetAddress.getLocalHost();
        String ip = i.getHostAddress();
        // Inicia a lista de arquivos do cliente
        this.listaArquivosLocal = new HashMap<String, ArquivoLocal>();
        File diretorio = new File(caminho);
        if( diretorio.exists() ){
            if(diretorio.isFile()){
                System.out.printf("Diretório invalido\n");
            } else {
                // Se o diretório existe, cria um ArquivoLocal para cada arquivo da pasta e adiciona a lista do cliente
                String[] arquivos = diretorio.list();
                for( String arquivo : arquivos){
                    File arquivo_list = new File(caminho+arquivo);
                    ArquivoLocal arquivolocal = new ArquivoLocal(arquivo_list.getName(),arquivo_list.lastModified(),ip, arquivo_list, true);
                    listaArquivosLocal.put(arquivo_list.getName(), arquivolocal);
                }
            }
        }
        try
        {
            // criar o Servidor que será utilizado nas chamadas RMI, criado aqui para ficar mais facil de utilizar
            this.servidor = (Service)Naming.lookup("rmi://localhost:11099/Servidor");
            // Obtem a lista de ArquivosLocal do servidor pela chamada obterListaArquivos(), e adiciona a lista do cliente
            // Os ArquivosLocal adicionados não contem o File, apenas para indicar o cliente dono do arquivo
            for (Iterator<ArquivoLocal> it = this.servidor.obterListaArquivos().values().iterator(); it.hasNext();) {
                ArquivoLocal arquivo = it.next();
                if (!this.listaArquivosLocal.containsKey(arquivo.getNome())){
                    this.listaArquivosLocal.put(arquivo.getNome(),arquivo);
                }
            }
        } 
        catch (Exception e) {
            System.out.println(e);
        }
    }
}
